<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<script>
    /**
    call:
    语法：call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义：调用一个对象的一个方法，以另一个对象替换当前对象。实际是括号里面的对象在执行
    说明： call 方法可以用来代替另一个对象调用一个方法。
    call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
    原文: http://ghmagical.com/article/page/id/UPLfoGI9vJ91 © ghmagical.com
    */
    /*
    * 这个例子中的意思就是用 eat 来替换 drink，eat.call(drink,3,2) == eat(3,2) ，所以运行结果为：console.log(5);
    * 注意：js 中的函数其实是对象，函数名是对 Function 对象的引用。
    */
    function eat(x,y){   
        console.log(x+y);
        console.log(x*y);
    }   
    function drink(x,y){   
        console.log(x-y);   
    }   
    eat.call(drink,3,2);//5,6
    /*
    * 把animal的方法放到dog上执行，也可以说，把animal 的showName()方法放到 dog上来执行，所以this.name 应该是 dog.
    */
    function Animal(){   
      this.name="animal";   
      this.showName=function(){   
          console.log(this.name);   
      }   
    }   
    function Dog(){   
      this.name="dog";   
  }   
  var animal=new Animal();   
  var dog=new Dog();
  animal.showName.call(dog);//dog
    /*
    * Animal.call(this) 的意思就是使用 Animal对象代替this对象，那么Dog就能直接调用Animal的所有属性和方法.
    * 原文: http://ghmagical.com/article/page/id/UPLfoGI9vJ91
    */
  function Animal(name){   
    this.name=name;   
    this.showName=function(){   
      console.log(this.name);   
    }   
  }   
  function Dog(name){   
    Animal.call(this,name);   
  }   
  var dog=new Dog("Crazy dog");   
  dog.showName();
/*  
    apply()
  语法：apply([thisObj[,argArray]])
  定义：应用某一对象的一个方法，用另一个对象替换当前对象。=
  说明：
  如果 argArray 不是一个有效的数组或者不是 arguments 对象，那么将导致一个 TypeError。
  如果没有提供 argArray 和 thisObj 任何一个参数，那么 Global 对象将被用作 thisObj， 并且无法被传递任何参数。
*/
function class1(args1,args2){       
  this.name=function(){      
   console.log(args1,args2);      
  }     
}     
function class2(){    
  var args1="1";
  var args2="2";
  class1.call(this,args1,args2);  
  /*或*/
  // class1.apply(this,[args1,args2]);
}
var c=new class2();   
c.name();

/*
* 合并两个数组
*/
var vegetables = ['parsnip', 'potato'];
var moreVegs = ['celery', 'beetroot'];

// Merge the second array into the first one
// Equivalent(等价的) to vegetables.push('celery', 'beetroot');
Array.prototype.push.apply(vegetables, moreVegs);
console.log(vegetables); // ['parsnip', 'potato', 'celery', 'beetroot']
</script>
</body>
</html>